// 手写 prmise.all
// promise.all 只有在全部的 promise 都是成功的时候才会返回成功的结果
function myAll(promises) {
  let result = [] // 最后成功的结果
  let len = promises.length;
  let count = 0;// 累加器，和len相比，用来判断是否全部成功了
  return new Promise((resolve, reject) => {
    for (const key of promises) { // 一次测试传入的参数，转化为promise是否成功的
      Promise.resolve(p).then((res => {
        result[key] = res; // 成功就加入结果数组
        count++; // 累加器加一
        if (count === len) { // 如果相等，就说明成功了，可以走成功的resolve了
          resolve(res)
        }
      }, error => { // 只要有一个失败了，就直接走失败的reject
        reject(error)
      }))
    }
  })
}

// promise.race只要有一个的状态发生了变化就会返回这个发生变化的结果
// 不管是成功还是失败的
function myRace(promises) {
  return new Promise((resolve, reject) => {
    for (const key of promises) {
      Promise.resolve(key).then(resolve, reject)
      // 或者是下面这样的
      Promise.resolve(key).then(res => {
        resolve(key)
      }, err => {
        reject(key)
      })
    }
  })
}

// promise.any
// any 的作用是，当传入的数组中有一个是成功的就返回成功，如果全都失败了，就返回失败的结果
function myAny(promises) {
  let errs = [];
  let len = promises.length;
  let count = 0;
  return new Promise((resolve, reject) => {
    promises.foreact((item, index) => {
      Promise.resolve(item).then(result => {
        resolve(result)
      }, error => {
        count++;
        errs.push(error);
        if (len == count) {
          reject(result)
        }
      })
    })
  })
}

// 手写 promise.allsettled
// all的作用是当所有的都成功之后才返回成功的结果
// 但是有时候需要无论是否是成功都需要返回对应的结果数组，这个时候就需要使用
// allsettled方法了
function myAllSettled(promises) {
  let len = promises.length;
  let count = 0;
  let result = [];
  return new Promise((resolve, reject) => {
    promises.foreact((item) => { // 遍历数组
      Promise.resolve(item).then(res => { // 这一步非常的重要，这一步是用来实现异步的
        // 同时用来处理非 promise 对象的情况
        result[count] = { // 用来记录成功的情况
          status: 'fullfiled',
          result: res
        }
        count++;
        if (count === len) {
          resolve(result) // 这一步也有一点的反人类，就是无论是成功还是失败，都会让他成功
        }
      }, error => {
        result[count] = { // 用来记录失败的情况
          status: 'rejected',
          result: error
        }
        count++;
        if (count === len) {
          resolve(result)
        }
      })
    })
  })
}